package com.ashion.findfuny;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SlidingDrawer;

@SuppressWarnings("deprecation")
public class DetailActivity extends Activity implements OnTouchListener,
		OnClickListener {
	private static final String TAG = DetailActivity.class.getSimpleName();
	private Context mContext;
	
	// These matrices will be used to move and zoom image
	Matrix matrix = new Matrix();
	Matrix savedMatrix = new Matrix();
	PointF start = new PointF();
	PointF mid = new PointF();
	float oldDist;
	private ImageView view;
	private float scaleWidth = 1;
	private float scaleHeight = 1;
	private Bitmap bmp, zoomedBMP;
	private int zoom_level = 0;
	private static final double ZOOM_IN_SCALE = 1.25;
	private static final double ZOOM_OUT_SCALE = 0.8;
	// We can be in one of these 3 states
	static final int NONE = 0;
	static final int DRAG = 1;
	static final int ZOOM = 2;
	int mode = NONE;
	
	private ListView listView;
	private DetailListAdapter listAdapter;
	private List<Map<String, Object>> listData;
	private SlidingDrawer slidingView;
	private boolean isViewing = false;
	private View navbarLayout;
	private View commentLayout;
	
	final Handler handler = new Handler(){  
		 public void handleMessage(Message msg) {  
		     switch (msg.what) {      
		     case 1:
		    	
		        break;      
		     }      
		     super.handleMessage(msg);  
		    }
		 };  
	
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_detail);
		mContext = this;
		/*zoomIn = (Button) findViewById(R.id.zoom_in);
		zoomOut = (Button) findViewById(R.id.zoom_out);
		
		zoomIn.setOnClickListener(this);
		zoomOut.setOnClickListener(this);*/
		navbarLayout = (View)findViewById(R.id.navibar_layout);
		commentLayout = (View)findViewById(R.id.comment_layout);
		
		view = (ImageView) findViewById(R.id.image_view);
		view.setOnTouchListener(this);
		bmp = BitmapFactory.decodeResource(this.getResources(),R.drawable.item_test);

		listView = (ListView)findViewById(R.id.comment_list_view);
		listData = initListData(listData);
		listAdapter = new DetailListAdapter(mContext, listView, listData);
		listView.setAdapter(listAdapter);
		
		slidingView = (SlidingDrawer)findViewById(R.id.sliding_view);
		TranslateAnimation anim = new TranslateAnimation(0, 0, 80, 0);
     	anim.setDuration(800);
     	anim.setInterpolator(AnimationUtils.loadInterpolator(mContext,
                 android.R.anim.anticipate_overshoot_interpolator));
    	slidingView.startAnimation(anim);
    	
    	
    	
    	
		/*Timer timer = new Timer(true);
		timer.schedule(task,500);*/
	}

	/*TimerTask task = new TimerTask(){  
	       public void run() {  
	       Message message = new Message();      
	       message.what = 1;      
	       handler.sendMessage(message);    
	    }  
	 };*/
	
	
	public boolean onTouch(View v, MotionEvent event) {
		// Handle touch events here...
		ImageView view = (ImageView) v;

		// Handle touch events here...
		switch (event.getAction() & MotionEvent.ACTION_MASK) {
		case MotionEvent.ACTION_DOWN:
			savedMatrix.set(matrix);
			start.set(event.getX(), event.getY());
			Log.d(TAG, "mode=DRAG");
			mode = DRAG;
			break;

		case MotionEvent.ACTION_UP:
		case MotionEvent.ACTION_POINTER_UP:
			mode = NONE;
			Log.d(TAG, "mode=NONE");
			break;
		case MotionEvent.ACTION_POINTER_DOWN:
			oldDist = spacing(event);
			Log.d(TAG, "oldDist=" + oldDist);
			if (oldDist > 10f) {
				savedMatrix.set(matrix);
				midPoint(mid, event);
				mode = ZOOM;
				Log.d(TAG, "mode=ZOOM");
			}
			break;
		case MotionEvent.ACTION_MOVE:
			if (mode == DRAG) {
				matrix.set(savedMatrix);
				matrix.postTranslate(event.getX() - start.x, event.getX()
						- start.x);
			}
			else if (mode == ZOOM) {
				float newDist = spacing(event);
				Log.d(TAG, "newDist=" + newDist);
				if (newDist > 10f) {
					matrix.set(savedMatrix);
					float scale = newDist / oldDist;
					matrix.postScale(scale, scale, mid.x, mid.y);
				}
			}
			break;
		}

		// Perform the transformation
		view.setImageMatrix(matrix);
		if(mode == NONE){
			if(isViewing){
				Animation navbarInAnim = AnimationUtils.loadAnimation(mContext, R.anim.translate_navbar_in); 
				navbarLayout.startAnimation(navbarInAnim);
				Animation commentInAnim = AnimationUtils.loadAnimation(mContext, R.anim.translate_comment_in); 
				commentLayout.startAnimation(commentInAnim);
				isViewing = false;
			}else{
				Animation navbarOutAnim = AnimationUtils.loadAnimation(mContext, R.anim.translate_navbar_out);
				navbarLayout.startAnimation(navbarOutAnim);
				Animation commentOutAnim = AnimationUtils.loadAnimation(mContext, R.anim.translate_comment_out); 
				commentLayout.startAnimation(commentOutAnim);
				isViewing = true;
			}
		}
		
		return true; // indicate event was handled
	}

	private float spacing(MotionEvent event) {
		float x = event.getX(0) - event.getX(1);
		float y = event.getY(0) - event.getY(1);
		return FloatMath.sqrt(x * x + y * y);
	}

	private void midPoint(PointF point, MotionEvent event) {
		float x = event.getX(0) + event.getX(1);
		float y = event.getY(0) + event.getY(1);
		point.set(x / 2, y / 2);
	}

	@Override
	public void onClick(View v) {
		/*if (v == zoomIn) {
			enlarge();
		} else if (v == zoomOut) {
			small();
		}*/
	}

	private void small() {
		int bmpWidth = bmp.getWidth();
		int bmpHeight = bmp.getHeight();

		scaleWidth = (float) (scaleWidth * ZOOM_OUT_SCALE);
		scaleHeight = (float) (scaleHeight * ZOOM_OUT_SCALE);

		Matrix matrix = new Matrix();
		matrix.postScale(scaleWidth, scaleHeight);
		zoomedBMP = Bitmap.createBitmap(bmp, 0, 0, bmpWidth, bmpHeight, matrix,
				true);
		view.setImageBitmap(zoomedBMP);
	}

	private void enlarge() {
		try {
			int bmpWidth = bmp.getWidth();
			int bmpHeight = bmp.getHeight();

			scaleWidth = (float) (scaleWidth * ZOOM_IN_SCALE);
			scaleHeight = (float) (scaleHeight * ZOOM_IN_SCALE);

			Matrix matrix = new Matrix();
			matrix.postScale(scaleWidth, scaleHeight);
			zoomedBMP = Bitmap.createBitmap(bmp, 0, 0, bmpWidth, bmpHeight,
					matrix, true);
			view.setImageBitmap(zoomedBMP);
		} catch (Exception e) {
			// can't zoom because of memory issue, just ignore, no big deal
		}
	}
	
	private List<Map<String, Object>> initListData(List<Map<String, Object>> listData){
		if(listData == null)
			listData = new ArrayList<Map<String, Object>>();
		for(int i=0;i<5;i++){
			Map<String, Object> map = new HashMap<String, Object>();
			map.put(CommonUtil.IMAGE, "");
			map.put(CommonUtil.TITLE, "Hello world");
			map.put(CommonUtil.USER, "Ashion");
			map.put(CommonUtil.COUNT, "122");
			listData.add(map);
		}
		return listData;
	}
}